import Joi from "joi";
import jwt from "jsonwebtoken";
import md5 from "md5";
import { RowDataPacket } from "mysql2";
import { getDB } from "~/server/utils/db/mysql/index";
import { responseJson } from "~/server/utils/helper/index";
/**
 * 1、获取客户端传来的手机号和密码
 * 2、数据校验
 * 3、查询数据库，如果不存在手机则返回手机号不存在或密码错误
 * 4、如果已经注册，并且密码正确，就生成token，并返回给客户端，token根据jwt生成
 */
export default defineEventHandler(async (event) => {
  // 1、获取客户端传来的手机号和密码
  const body = await readBody(event);

  // 2、数据校验
  const schema = Joi.object({
    password: Joi.string().required(),
    phone: Joi.string()
      .pattern(/^1[3-9]\d{9}$/)
      .required(),
  });
  try {
    await schema.validateAsync(body);
  } catch (error) {
    return responseJson(1, "参数错误", {});
  }

  // 密码加密
  let salt = "jbook";
  let password = md5(md5(body.password) + salt);

  // 也检查明文密码（为了兼容已存在的错误数据）
  let plainPassword = body.password;
  const con = getDB();

  try {
    // 4、查询数据库，如果不存在手机则返回手机号不存在或密码错误
    const [rows] = await con.execute<RowDataPacket[]>(
      "SELECT * FROM `users` WHERE `phone`=? AND (`password`=? OR `password`=?) ",
      [body.phone, password, plainPassword]
    );
    if (Array.isArray(rows) && rows.length === 0) {
      return responseJson(1, "用户信息错误", {});
    }
    // 生成token
    // 密钥
    const secret = "jbook";
    let token = jwt.sign(
      {
        exp: Math.floor(Date.now() / 1000) + 60 * 60,
        data: { uid: rows[0].id },
      },
      secret
    );
    return responseJson(0, "登录成功", {
      accessToken: token,
      userInfo: {
        id: rows[0].id,
        nickname: rows[0].nickname,
        phone: rows[0].phone,
        avatar: rows[0].avatar,
      },
    });
  } catch (error) {
    // 记录错误详情以便调试
    console.error("登录失败错误详情:", error);
    // 如果是数据库连接错误，提供更详细的错误信息
    if (error instanceof Error) {
      console.error("错误消息:", error.message);
      console.error("错误堆栈:", error.stack);
    }
    return responseJson(1, "登录失败", {});
  }
  // 注意：不要关闭连接池！连接池应该保持打开状态以供后续使用
  // 连接池会自动管理连接的获取和释放
});
